package com.binc.testspring.common.config;

import com.binc.testspring.common.filter.BincFilter;
import com.binc.testspring.common.interceptor.BincInterceptor_first;
import com.github.lianjiatech.retrofit.spring.boot.annotation.RetrofitScan;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 *
 * 这个现在是关于spring  mvc的配置类  ,配置的东西有点多主要分为一下内容
 * 一、 拦截器配置
 * 二、 swagger 静态资源配置
 * 三、 过滤起配置
 *      1 通过FilterRegistrationBean来配置过滤器
 *      2 不用配置，直接在自定义过滤器上用注解来玩；（自定义过滤器类添加@webfilter  配置类或者启动类添加@ServletComponentScan("包路径")）
 *
 *
 * 详细说明
 *  一、自定义拦截器的配置
 *      两件事情注意：1 注册一个自定的拦截器到容器！实现WebMvcConfigurer ！重写addInterceptors 方法，将自定义拦截器bean添加到拦截器链中
 *               2 @Configuration
 *
 * 二、静态资源配置、页面跳转配置  swagger配置
 *
 * 三、过滤器配置
 *
 *
 *
 *
 * SpringBoot---WebMvcConfigurer详解   https://blog.csdn.net/zhangpower1993/article/details/89016503
 * WebMvcConfigurer的作用：直接点就是web的配置都可以在这类里面干； 可以查看spring的文档, 其定义了很多供重构的方法
 *
 * InterceptorConfig.java 改名
 *
 */
@Configuration
@RetrofitScan("com.binc.testspring.service")  //这个是retrofit  starter的注解   这里些到包名就行了
@ServletComponentScan("com.binc.testspring.common.filter")
public class WebMvcConfig implements WebMvcConfigurer {

    @Bean
    public BincInterceptor_first firstInterceptor() {

        return new BincInterceptor_first();
    }

    /*
     页面跳转配置
     */
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("alogin");
        registry.addViewController("/login").setViewName("alogin");
        registry.addViewController("/main.html").setViewName("dashboard");
    }




    //!!! 这个拦截器太烦人了，临时给关闭了!!!!
    /**
     * 注册拦截器配置
     */
    // @Override
    // public void addInterceptors(InterceptorRegistry registry) {
    //     registry.addInterceptor(firstInterceptor()) //注册一个自定一的拦截器
    //             .addPathPatterns("/**")     // 拦截所有请求
    //             .excludePathPatterns(  // 添加不拦截的路径    这里也可以在【preHandler报错那里加上 instanceof 关键字进行判断。】
    //                     "/login",
    //                     "/",
    //                     "/user/login"
    //                     ,"/swagger-resources/**", "/webjars/**", "/v2/**", "/swagger-ui.html/**"   // 这里是排除swagger的拦截
    //                     ,"/doc.html/**","/swagger-ui.html/**","/docs.html/**"   //这里是排除 swagger 别的ui的拦截
    //                     /*
    //                     springboot2之后开始拦截静态资源了， 如果我们进行了 mvc的 addResourceHandlers()配置，那么如果访问这些静态资源的时候， 本拦截器方法中的handler形参 其实是一个ResourceHttpRequestHandler，
    //                             如果强转成HandlerMethod 是要报错的(就会抛出【java.lang.ClassCastException: org.springframework.web.servlet.resource.ResourceHttpRequestHandler cannot be cast to org.springframework.web.method.HandlerMethod】错误)；
    //                             解决办法有两个；
    //                             1 在拦截器那里排除静态资源的请求路径，也就是静态资源的访问不会被拦截到，也就走不到拦截器方法，也就没有强转什么事情了  （一劳永逸，推荐）
    //                             2 拦截器配置不做调整，但是在拦截器方法上添加一个代码，判断一下handler instanceof 什么类型的；如果是heanlderMethod就继续执行，
    //                                 如果是ResourceHttpRequestHandler类型 就跳过（return true），跳过拦截器的方法；
    //                             方式2有个缺点：如果没添加一个拦截器的话，都得想着添加这个东西（不是很推荐）
    //                     */
    //
    //                     //,"/document.html"   //这个documnet.html的处理方式是通过方式2实现的；也好使！
    //                     ,"/**/*.css","/**/*.js"  //排除静态资源
    //             );
    //
    // }

    /*
     * 静态资源配置
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        /*
            bootstrap-ui 访问 http://localhost:8080/doc.html
            <!-- 引入swagger-bootstrap-ui包 /doc.html-->
            <dependency>
               <groupId>com.github.xiaoymin</groupId>
               <artifactId>swagger-bootstrap-ui</artifactId>
               <version>1.9.1</version>
            </dependency>

         */
        registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/");
        /*
            Layui-ui 访问 http://localhost:8080/docs.html
            <!-- 引入swagger-ui-layer包 /docs.html-->
            <dependency>
               <groupId>com.github.caspar-chen</groupId>
               <artifactId>swagger-ui-layer</artifactId>
               <version>1.1.3</version>
            </dependency>
         */
        registry.addResourceHandler("docs.html").addResourceLocations("classpath:/META-INF/resources/");
        /*
             mg-ui 访问 http://localhost:8080/document.html
                <!-- 引入swagger-ui-layer包 /document.html-->
                    <dependency>
                       <groupId>com.zyplayer</groupId>
                       <artifactId>swagger-mg-ui</artifactId>
                       <version>1.0.6</version>
                    </dependency>
         */
        registry.addResourceHandler("document.html").addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
    }


    /*
    通过 FilterRegistrationBean 配置来注册过滤器

        这样配置就完成了，需要配置的选项主要包括:
            实例化Filter类，
            然后指定url的匹配模式，
            设置过滤器名称和执行顺序，
            这个过程和在web.xml中配置其实没什么区别，只是形式不同而已。现在我们可以启动服务器访问任意URL：
     */
    @Bean
    public FilterRegistrationBean registFilter() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(new BincFilter()); //注册自定义的过滤器
        registration.addUrlPatterns("/*");
        registration.setName("LogCostFilter");
        registration.setOrder(1);
        return registration;
    }


}
